
package $14_objecttransform1;
/*多态前提：
1.必须有继承或实现关系
2.必须有方法重写
3.必须有父类引用指向子类对象 -------------> 其实这就是向上转型的一种实现
好处：提高方法的灵活性
如果一个方法中使用父类或父接口作为形式参数，将来调用该方法时，可以传递任意的子类对象！

多态的弊端：无法使用子类特有的成员
如果想使用子类特有的成员，就需要向下转型。
子类 对象名 = (子类) 父类对象a;  这样可以把父类对象a转换成子类对象*/
public class UpTransform
{
	public static void main(String[]args)
	{
		//1.父类引用指向子类对象
		Animal a = new Dog(); //   左:父类引用 = 右：子类对象
		a.shout();
		
		System.out.println("-------------------------------------");
		
		
		//3.创建对象来调用shout方法
		Dog d2 = new Dog();
		useAnimal(d2);
		Cat c2 = new Cat();
		useAnimal(c2);
		
		
	}
	//3.通用的方法（可以接收任意的子类对象）
	public static void useAnimal(Animal ani)
	//这是把父类对象作为方法的参数，将来使用这个方法，则在括号里面写上子类对象，就相当于Animal ani = 子类对象;
	{
		ani.shout();
		//ani.show();  // 这里报错了，父类声明引用子类对象无法使用子类特有的方法
	}
	
}




abstract class Animal
{
	public abstract void shout();
}


class Dog extends Animal
{
	//shout()重写
	public void shout()
	{
		System.out.println("汪汪汪");
	}
	//写一个Dog特有的成员方法show()
	public void show()
	{
		System.out.println("one one one");
	}
}


class Cat extends Animal
{
	//shout()重写
	public void shout()
	{
		System.out.println("喵喵喵");
	}
}

